const gameObjects=[];//定义一个数组
export class GameObject{ //导出类(所有游戏对象的基类)
    constructor(){ //构造函数
        gameObjects.push(this); //每创建一个游戏管理对象就将其添加到 上面的数组里
        this.timedelta=0; //定义一个属性表示当前一帧和上一帧的时间间隔
        this.hasCalledStart=false; //定义一个属性是否已经调用了start方法
    }
    start(){} //开始执行一次，后续不在执行 
    update(){}//每一帧执行一次，除了第一帧以外
    onDestroy(){}//删除之前执行
    destroy(){ 
        this.onDestroy(); //调用
        for(let i in gameObjects){ //遍历整个数组，i表示索引(in 遍历的是下标 of 遍历的是值)
            const obj = gameObjects[i];
            if(obj === this){ //如果对象符合当前对象
                gameObjects.splice(i); //这个函数表示删除从i下标往后的所有元素
                break; //不在遍历后面
            }
        }
    } //销毁对象

}
let lastTimestamp;//表示上一次执行的时刻
const step = timestamp => {
    //游戏总循环
    for(let obj of gameObjects){ //遍历所有的游戏对象
        if(!obj.hasCalledStart){ //如果对象没有执行过start函数
            obj.hasCalledStart=true;
            obj.start();
        }else{//如果已经执行过了
            obj.timedelta=timestamp-lastTimestamp;
            obj.update();
        }
    }
    lastTimestamp = timestamp;
    requestAnimationFrame(step); //递归调用使之成为游戏总循环
}

requestAnimationFrame(step); //浏览器默认1s刷新六十次，这个方法表示在浏览器下一次刷新之前调用函数